/**
 * @author 徐楠
 * @date 2022/4/2 11:00
 * @version 1.0
 */

package com.xunan.likou;


public class SpiralMatrixTwo {
    public static void main(String[] args) {
        int[][] result = generateMatrix(3);
        System.out.print("[");
        for (int[] ints : result) {
            System.out.print("[");
            System.out.print(" ");
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.print("]");
        }
        System.out.print("]");
    }

    public static int[][] generateMatrix(int n) {

        /**
         * 列长
         * 1
         * 1
         * 1
         *
         *    x: 0 1 2 3 4
         * y:  0 * * * * *
         *     1 *
         *     2 *
         *     3 *
         */
        int x = n;
        /**
         * 行长
         * -------
         */
        int y = n;
        int i = 0;
        int temp = 1;
        int[][] result = new int[x][y];
        //统计矩阵从外向内的层数，如果矩阵非空，那么它的层数至少为1层
        int count = (n + 1) / 2;
        //从外部向内部遍历，逐层打印数据
        while (i < count) {
            //第 1 个：从左向右
            for (int j = i; j < n - i; j++) {
                result[i][j] = temp++;
            }
            //第 2 个：从上往下
            for (int j = i + 1; j < n - i; j++) {
                result[j][(n - 1) - i] = temp++;
            }
            //第 3 个：从右往左，如果这一层只有1行，那么第一个循环已经将该行打印了,，这里就不需要打印了即 （m-1-i ）!= i
            for (int j = (n - 1) - (i + 1); j >= i + 1 && (n - 1 - i) != i; j--) {
                result[j][i] = temp++;
            }
            //第4个：从下往上，如果这一层只有1列，那么第2个循环已经将该列打印了，这里不需要打印，即(n-1-i) != i
            for (int j = (n - 1) - (i + 1); j >= i && (n - 1 - i) != i; j--) {
                result[(n - 1) - i][j] = temp++;
            }
            i++;
        }
        return result;
    }
}
